/**
 * 本地存储工具类
 * 封装uni-app的存储API，提供统一的存储管理
 */

const STORAGE_PREFIX = 'bip_edu_'

class Storage {
  /**
   * 设置存储
   * @param {string} key - 存储键名
   * @param {any} value - 存储值
   * @param {boolean} isSync - 是否同步存储（默认true）
   */
  set(key, value, isSync = true) {
    const storageKey = STORAGE_PREFIX + key
    const data = {
      value,
      timestamp: Date.now(),
      expire: null
    }
    
    try {
      if (isSync) {
        uni.setStorageSync(storageKey, JSON.stringify(data))
      } else {
        uni.setStorage({
          key: storageKey,
          data: JSON.stringify(data)
        })
      }
      return true
    } catch (error) {
      console.error('Storage set error:', error)
      return false
    }
  }

  /**
   * 获取存储
   * @param {string} key - 存储键名
   * @param {any} defaultValue - 默认值
   * @returns {any} 存储值或默认值
   */
  get(key, defaultValue = null) {
    const storageKey = STORAGE_PREFIX + key
    
    try {
      const dataStr = uni.getStorageSync(storageKey)
      if (!dataStr) return defaultValue
      
      const data = JSON.parse(dataStr)
      
      // 检查是否过期
      if (data.expire && Date.now() > data.expire) {
        this.remove(key)
        return defaultValue
      }
      
      return data.value
    } catch (error) {
      console.error('Storage get error:', error)
      return defaultValue
    }
  }

  /**
   * 设置带过期时间的存储
   * @param {string} key - 存储键名
   * @param {any} value - 存储值
   * @param {number} expireSeconds - 过期时间（秒）
   */
  setWithExpire(key, value, expireSeconds) {
    const storageKey = STORAGE_PREFIX + key
    const data = {
      value,
      timestamp: Date.now(),
      expire: Date.now() + (expireSeconds * 1000)
    }
    
    try {
      uni.setStorageSync(storageKey, JSON.stringify(data))
      return true
    } catch (error) {
      console.error('Storage setWithExpire error:', error)
      return false
    }
  }

  /**
   * 删除存储
   * @param {string} key - 存储键名
   */
  remove(key) {
    const storageKey = STORAGE_PREFIX + key
    
    try {
      uni.removeStorageSync(storageKey)
      return true
    } catch (error) {
      console.error('Storage remove error:', error)
      return false
    }
  }

  /**
   * 清空所有存储
   */
  clear() {
    try {
      const keys = uni.getStorageInfoSync().keys
      keys.forEach(key => {
        if (key.startsWith(STORAGE_PREFIX)) {
          uni.removeStorageSync(key)
        }
      })
      return true
    } catch (error) {
      console.error('Storage clear error:', error)
      return false
    }
  }

  /**
   * 获取所有存储键名
   * @returns {Array} 键名数组
   */
  keys() {
    try {
      const keys = uni.getStorageInfoSync().keys
      return keys
        .filter(key => key.startsWith(STORAGE_PREFIX))
        .map(key => key.replace(STORAGE_PREFIX, ''))
    } catch (error) {
      console.error('Storage keys error:', error)
      return []
    }
  }

  /**
   * 检查是否存在
   * @param {string} key - 存储键名
   * @returns {boolean} 是否存在
   */
  has(key) {
    return this.get(key) !== null
  }

  /**
   * 获取存储信息
   * @returns {Object} 存储信息
   */
  info() {
    try {
      return uni.getStorageInfoSync()
    } catch (error) {
      console.error('Storage info error:', error)
      return {}
    }
  }
}

// 创建实例
const storage = new Storage()

// 常用存储键名
export const STORAGE_KEYS = {
  // 用户相关
  TOKEN: 'token',
  USER_INFO: 'user_info',
  USER_PREFERENCES: 'user_preferences',
  SEARCH_HISTORY: 'search_history',
  
  // 课程相关
  COURSE_CACHE: 'course_cache',
  MY_COURSES: 'my_courses',
  
  // 考试相关
  EXAM_CACHE: 'exam_cache',
  MY_EXAMS: 'my_exams',
  
  // 系统相关
  APP_CONFIG: 'app_config',
  CACHE_VERSION: 'cache_version',
  
  // 临时数据
  TEMP_DATA: 'temp_data'
}

export default storage